package mtest3.day5;

import mtest3.day4.IStack;

public class LinkStack implements IStack {
    Node top;

    public LinkStack() {
        //top 初始为null  添加数据后 指向栈顶的元素
        top = null;
    }

    @Override
    public void clear() {
        top = null;
    }

    @Override
    public int length() {
        //记录栈顶结点 用来遍历后续结点
        Node curNode = top;
        int num = 0;
        while (curNode != null) {
            num++;
            curNode = curNode.next;
        }

        return num;
    }

    @Override
    public boolean isEmpty() {
        return top == null;
    }

    @Override
    public void push(Object e) {
//        创建新的结点
        Node newNode = new Node(e);
        //让新节点的next指向top
        newNode.next = top;
        //让top指向新的结点
        top = newNode;

        //top = new Node(e,top);  上面三行 和这一行代码 作用一样
    }

    /**
     * 删除并且返回栈顶数据
     *
     * @return 返回栈顶数据
     */
    @Override
    public Object pop() {
        if (isEmpty()) {
            return null;
        }
        //保存旧的top结点
        Node oldTop = top;

        //让top指向栈顶的下一个元素
        top = top.next;

        return oldTop.data;
    }

    /**
     * @return 返回栈顶数据
     */
    @Override
    public Object peek() {
        if (isEmpty()) {
            return null;
        }
        return top.data;
    }

    /**
     * 展示数据
     */
    public void display() {
        //记录栈顶结点 用来遍历后续结点
        Node curNode = top;

        while (curNode != null) {
            System.out.println(curNode.data + "-----");
            curNode = curNode.next;
        }
    }
}
